package com.daiyang.javabasics.代理.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Star {
    void readLetter(String letter);
}
//真实明星
class RealStar implements Star {
    private String name;
    public RealStar(String name) {
        this.name = name;
    }
    @Override
    public void readLetter(String letter) {
        System.out.println(name + "读到了" + letter);
    }
}
// 3代理处理器
class StarAgentHandler implements InvocationHandler {
    private Object target; //被代理的真实对象

    StarAgentHandler(Object target) {
        this.target = target;
    }

    // 负责处理自定义逻辑，当我们动态代理对象调用一个方式时，这个方法的调用就会被转发到这里
    // 负责处理自定义逻辑，当我们动态代理对象调用一个方式时，这个方法的调用就会被转发到这里
    // proxy: 动态代理对象
    // method: 与代理类对象调用的方法相对应
    // args: 当前method的方法参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("经纪人收到了粉丝来信");
        System.out.println("经纪人检查信件安全性");
        //转发给真实的明星
        Object result = method.invoke(target, args);
        System.out.println("经纪人记录信件处理完成");
        return result;
    }
}
public class  JDKLIBDynameicProxy{
    public static void main(String[] args) {
        //1.创建真实的明星
        Star realStar = new RealStar("kun");
        //2.创建经纪人
        Star proxy = (Star) Proxy.newProxyInstance(
                realStar.getClass().getClassLoader(),
                realStar.getClass().getInterfaces(),
                new StarAgentHandler(realStar)
                );

        proxy.readLetter("kun 你好");
        proxy.readLetter("kun 你好");
        proxy.readLetter("kun 你好");
    }

}


